/**
 *
 * https://fighter3.blog.csdn.net/article/details/122814377
 *
 * TCP三次握手：
 * 1.客户端开始建立第一次连接，发送sync包，并且附带一个seq序列号x给服务端，状态变为SYN_SEND
 * 2.服务端收到客户端发起的请求，接收到sync包，生产一个seq序列号y，并且回应刚才服务端发送的序列号ack = x + 1，同时也发送一个sync包给客户端，状态变为ESTABLISHED
 * 3.客户端接收到服务端的数据包，再发送ack = y + 1 ，seq = x + 1给服务端，状态变为ESTABLISHED
 *
 * TCP和http的区别和联系
 * 1.TCP是传输层协议，定义数据传输的规范
 * 2.HTTP是应用层协议，定义传输的内容的规范
 * 3.HTTP协议的数据是利用TCP协议传输的
 *
 * 为什么是三次握手而不是两次：
 * 1.防止失效的连接请求报文段被服务端接收，从而产生错误。若是客户端向服务端发送的连接请求丢失，客户端超时之后就会再次发送，
 *   如果超时发送的这个请求服务端接收到了，那就建立了连接。但是那个丢失的请求假如又到了服务端，又建立了连接，然后客户端连接已经关闭了，
 *   服务端的这个连接就会一直等待下去，占用系统资源
 *
 * TCP与UDP的区别：
 * 1.TCP面向连接，UDP无连接
 * 2.TCP提供可靠的服务，通过TCP连接传送的数据无差错，不丢失，按时到达，UDP不保证可靠的交付，就是不保证你数据一定会发送到
 * 3.UDP具有较好的实时性，工作效率比TCP高，适用于通信和广播通信
 * 4.TCP对系统资源要求较多，UDP较少
 * 5.TCP只能点对点的发送接收，而UDP还可进行广播，一对多，多对一，多对多都行
 *
 * DOS攻击：
 * 1.在三次握手的期间，客户端接收到服务端返回的握手请求，但是不给予响应，让服务端一直等着，windows的默认超市时间是4分钟
 * 2.若是这样发起了大量连接，则导致服务器崩溃
 *
 * SYN洪泛攻击
 * 1.当第三次握手没有发送确认信息，等待一段时间后，服务端会自动端口连接，回收资源。
 * 2.如果客户端一直发送syn包但不发送第三次握手响应，服务器还是会分配相应资源，占用内存，叫做syn洪泛攻击
 *
 * TCP四次挥手：
 * 1.客户端发送连接释放报文，停止发送数据，主动关闭TCP连接 FIN=1,SEQ=X
 * 2.服务器端回送一个确认报文，客户到服务器这个方向的连接就释放了（但是服务器还是可以发送数据） ACK=1,SEQ=Y,ACK=X+1
 * 3.服务端发完数据，就发出连接释放报文，主动关闭TCP连接 FIN=1,ACK=1,SEQ=Y,ACK=X+1
 * 4.服务端回送一个确认报文段，再等到时间等待计算器设置为2MSL（最长报文段寿命）后，彻底关闭连接 ACK=1,SEQ=X+1,ACK=Y+1
 *
 * 为什么不是三次挥手
 * 1.如果是三次挥手，那就是把服务端的响应合并成了一次，但是服务端当时可能是有数据传输的，fin包和ack一起发的话，可能是很长的一段时间
 *   会导致客户端超时重发等情况出现
 *
 * TCP黏包和拆包：
 * 1.定义：TCP是流协议，没有界限的一串数据，所以底层并不了解上层业务。在数据发送到TCP缓冲区的时候，可能会将很多数据包拼接成一个大的包发送
 *   也可能将大的包拆分成多个小的数据包发送
 * 2.发生原因：
 *      1.要发送的数据小于TCP缓冲区的大小，TCP将多次写入的数据一起发送了，会发生粘包
 *      2.接收端没有及时读取数据，会发生粘包
 *      3.要发送的数据大于TCP缓冲剩余空间，发生拆包
 *      4.待发送的数据大于最大报文长度，会发生拆包
 * 3.解决策略：
 *      1.消息定长
 *      2.消息设置边界，比如在消息结尾用换行符
 *      3.设置消息头和消息体，消息头表示总长度
 *
 * RPC和HTTP的区别：
 * 1.性能：主要是序列化和反序列化  rpc通过二进制传输，http通过Json，http更消耗性能
 * 2.负载均衡：rpc自带负载均衡，http需要自找（nginx）
 * 3.传输效率：rpc可以自定义tcp协议 报文相对较小  tcp报文包含很多没用的东西
 * 4.rpc是传输层协议，http是应用层协议
 * 5.rpc是长连接，不必三次握手，效率更高
 * 6.rpc适合内部调用，Http适合多个不同系统间调用
 *
 * HTTP1.0,1.1,2.0区别
 * 1.短连接，长连接，长连接 + io多路复用
 *
 * https和http的区别：
 * 1.http是超文本传输协议，信息是明文传输，存在安全风险问题。https则解决http不安全的缺陷，在TCP和http网络层之间加了SSL/TLS安全协议，使得报文能加密传输
 * 2.http连接建立相对简单，TCP三次握手之后便可进行http报文得传输；而https要在三次握手后还要进行SSL/TLS得握手过程，才可进行加密报文传输
 * 3.http得端口号是80，https是443
 * 4.https需要向ca(证书权威机构)申请数字证书，来保证服务器得身份是可信的
 *
 * 一个http请求从前端到后端的全过程
 *      1.浏览器根据域名解析ip地址
 *          1.浏览器缓存：搜索浏览器自身的DNS缓存，看是否有对应条目
 *          2.若是浏览器缓存没找到，就找自身系统的DNS缓存
 *          3.若是系统的缓存也没找到，就会向路由器发送查询
 *          4.查询ISP缓存服务器，一般是运营商那边的DNS服务器
 *      2.浏览器与服务器建立TCP连接（TCP的三次握手）
 *      3.建立TCP连接之后，浏览器发送HTTP请求
 *          1.HTTP请求由请求行，请求头，空行，请求体组成
 *              1.请求行：请求方法，请求地址，Http版本
 *      4.服务器响应浏览器的请求，返回HTML代码
 *          1.HTTP响应报文由状态行，响应头，响应数据组成
 *      5.浏览器解析HTML代码，请求HTML代码中的资源，CSS,JS等
 *      6.关闭TCP连接（四次挥手），浏览器对面页面进行渲染返回给用户
 * OSI七层网络模型
 *      1.物理层：保证数据可以在各种物理媒介上传输，提供传输环境
 *      2.数据链路层：在两个相邻节点传输数据，负责将网络层交下来的ip数据报组装成帧，在两个节点之间的链路上传输桢
 *      3.网络层：网络层为分组网络中的不同主机提供通信服务，并通过选择合适的路由将数据发送到目标主机。在发送的时候，网络层把运输层产生的报文
 *        段或用户的数据封装成分组或包进行传输
 *      4.传输层：负责为两台主机中的进程提供服务通信，主要有两种协议
 *          1.TCP：提供面向连接的、可靠的数据传输服务，数据传输的基本单位是报文段
 *          2.UDP：提供无连接的、尽自己最大努力通知的数据传输服务，但不保证数据传输的可靠性，数据传输的基本单位是用户数据报
 *      5.会话层：会话的开始、恢复、释放、同步，指的是cookie或者session的连接和传输
 *      6.表示层：数据的加密和压缩，编码解码，图片，文件之类的
 *      7.应用层：主要通过进程间的交互完成特定的网络应用，比如域名系统DNS，邮件系统STMP，万维网HTTP，应用层交互数据称为报文
 *
 * https的工作流程
 *      1.客户端发起HTTPS请求，连接到服务端的443端口
 *      2.服务端有一套数字证书（证书内容有公钥，证书颁发机构，失效日期等）
 *      3.服务端将自己的数字证书发给客户端（公钥在证书里面，私钥由服务器持有）
 *      4.客户端收到数字证书之后会校验证书的合法性，如果证书验证通过，就会生成一个随机的对称密钥，用证书的公钥加密
 *      5.客户端将公钥加密后的密钥发送到服务器
 *      6.服务端接受到客户端发来的密文密钥之后，用自己之前保存的私钥对其进行非对称解密，解密之后就得到客户端的密钥，然后用客户端的密钥对返回数据
 *        进行对称加密，这样传输的数据都是密文了
 *      7.服务器将加密之后的密文返回给客户端
 *      8.客户端收到后，用自己的密钥，对其进行对称解密，得到服务器返回的数据
 *
 * @author
 * @created 2022/1/4 21:14
 */
public class TCPConnect {

}
